package service

import (
	"context"
	"fmt"
	"strings"

	"techoiceness.com/aiagent/llm-gateway/internal/llm"
	"techoiceness.com/aiagent/llm-gateway/internal/llm/types"
)

// TitleGenerator 标题生成器
type TitleGenerator struct {
	llmProviderManager *llm.ProviderManager
}

// NewTitleGenerator 创建标题生成器
func NewTitleGenerator(llmProviderManager *llm.ProviderManager) *TitleGenerator {
	return &TitleGenerator{
		llmProviderManager: llmProviderManager,
	}
}

// GenerateTitle 根据用户输入生成会话标题
func (tg *TitleGenerator) GenerateTitle(ctx context.Context, userInput string) (string, error) {
	// 构建生成标题的提示词
	prompt := fmt.Sprintf(`请根据以下用户输入生成一个简洁的会话标题，要求：
1. 标题长度不超过50个字符
2. 准确概括用户的主要意图或问题
3. 使用中文
4. 只返回标题，不要其他内容

用户输入：%s

标题：`, userInput)

	// 创建请求
	req := types.Request{
		Model: tg.llmProviderManager.GetAvailableModel().Name,
		Messages: []types.Message{
			{
				Role:    types.RoleUser,
				Content: prompt,
			},
		},
	}

	// 获取当前可用的提供者
	availableProvider := tg.llmProviderManager.GetAvailableProvider()
	if availableProvider == nil {
		return "", fmt.Errorf("没有可用的提供者")
	}

	// 直接调用提供者，不经过agent
	resp, err := availableProvider.Chat(ctx, req)
	if err != nil {
		return "", fmt.Errorf("failed to generate title: %w", err)
	}

	if len(resp.Choices) == 0 {
		return "", fmt.Errorf("no response from LLM")
	}

	title := strings.TrimSpace(resp.Choices[0].Message.Content)

	// 如果标题为空或太长，使用默认标题
	if title == "" || len(title) > 50 {
		// 截取用户输入的前20个字符作为标题
		if len(userInput) > 20 {
			title = userInput[:20] + "..."
		} else {
			title = userInput
		}
	}

	return title, nil
}

// GenerateTitleFromConversation 基于完整对话生成更准确的标题
func (tg *TitleGenerator) GenerateTitleFromConversation(ctx context.Context, userPrompt, aiReply string) (string, error) {
	// 构建生成标题的提示词
	prompt := fmt.Sprintf(`请根据以下对话内容生成一个简洁的会话标题，要求：
1. 标题长度不超过50个字符
2. 准确概括对话的主要内容和方向
3. 使用中文
4. 只返回标题，不要其他内容

用户：%s
助手：%s

标题：`, userPrompt, aiReply)

	availableModelInfo := tg.llmProviderManager.GetAvailableModel()
	if availableModelInfo == nil {
		return "", fmt.Errorf("没有可用的模型")
	}

	// 创建请求
	req := types.Request{
		Model: availableModelInfo.Name,
		Messages: []types.Message{
			{
				Role:    types.RoleUser,
				Content: prompt,
			},
		},
	}

	// 获取当前可用的提供者
	availableProvider := tg.llmProviderManager.GetAvailableProvider()
	if availableProvider == nil {
		return "", fmt.Errorf("没有可用的提供者")
	}

	// 直接调用提供者，不经过agent
	resp, err := availableProvider.Chat(ctx, req)
	if err != nil {
		return "", fmt.Errorf("failed to generate title: %w", err)
	}

	if len(resp.Choices) == 0 {
		return "", fmt.Errorf("no response from LLM")
	}

	title := strings.TrimSpace(resp.Choices[0].Message.Content)

	// 如果标题为空或太长，使用默认标题
	if title == "" || len(title) > 50 {
		// 截取用户输入的前20个字符作为标题
		if len(userPrompt) > 20 {
			title = userPrompt[:20] + "..."
		} else {
			title = userPrompt
		}
	}

	return title, nil
}
